#include "seq_stack.h"

// 创建栈
int create_stack(stack_t **p){
    if(NULL == p){
        printf("入参为NULL 请检查\n");
        return -1;
    }
    *p = (stack_t *)malloc(sizeof(stack_t));
    if(NULL == *p){
        printf("内存分配失败\n");
        return -1;
    }
    (*p)->top = 0;
    return 0;
}

// 清空栈
int clean_stack(stack_t *my_stack){
    if(NULL == my_stack){
        printf("入参为NULL 请检查\n");
        return -1;
    }
    my_stack->top = 0;
    return 0;
}

// 销毁栈
int destroy_stack(stack_t **my_stack){
    if(NULL == my_stack || NULL == *my_stack){
        printf("入参为NULL 请检查\n");
        return -1;
    }
    free(*my_stack);
    *my_stack = NULL;
    return 0;
}

// 数据入栈(压栈)--push
int push_stack(stack_t *my_stack, int num){
    if(NULL == my_stack){
        printf("入参为NULL 请检查\n");
        return -1;
    }
    if(is_full(my_stack)){
        //printf("栈满 入栈失败\n");
        return -1;
    }
    my_stack->data[my_stack->top] = num;
    my_stack->top++;
    return 0;
}

// 判断栈是否满 返回0没满  返回1满了
int is_full(stack_t *my_stack){
    if(NULL == my_stack){
        printf("入参为NULL 请检查\n");
        return -1;
    }
    return N == my_stack->top ? 1 : 0;
}

// 数据出栈(弹栈)--pop
int pop_stack(stack_t *my_stack, int *buff){
    if(NULL == my_stack || NULL == buff){
        printf("入参为NULL 请检查\n");
        return -1;
    }
    if(is_empty(my_stack)){
        //printf("栈空 出栈失败\n");
        return -1;
    }
    my_stack->top--;
    *buff = my_stack->data[my_stack->top];
    return 0;
}

// 判断栈是否空  返回0没空  返回1空了
int is_empty(stack_t *my_stack){
    if(NULL == my_stack){
        printf("入参为NULL 请检查\n");
        return -1;
    }
    return 0 == my_stack->top ? 1 : 0;
}

// 打印栈中所有元素--实际不需要 只是学习阶段用来看现象的
int print_stack(stack_t *my_stack){
    if(NULL == my_stack){
        printf("入参为NULL 请检查\n");
        return -1;
    }
    int i = 0;
    for(i = 0; i < my_stack->top; i++){
        printf("%d ", my_stack->data[i]);
    }
    printf("\n");
    return 0;
}